#include "include.h"

#if EXLIB_BT_MONO_XDRC_EN
void xdrc_online_adj_init(void);
extern u32 dac_obuf[576 + 512];
void obuf_put_samples_w(void *buf, uint len);


#define XDRC_PRINT_PCM   0

AT(.com_text.xdrc)
void xdrc_dual_processs(u8 *buf, u32 samples, u32 is_24bit)
{
#if XDRC_PRINT_PCM
    static u32 ticks = 0;
    if (tick_check_expire(ticks,1000)) {
        print_r(buf,16);
    }
#endif

    pcm_dual_2_mon(buf,samples, is_24bit);
    xdrc_mono_process(buf,samples,is_24bit);
    pcm_mon_2_dual(buf,samples, is_24bit);

#if XDRC_PRINT_PCM
    if (tick_check_expire(ticks,1000)) {
        ticks = tick_get();
        print_r(buf,16);
    }
#endif
}

AT(.text.bsp.dac)
void xdrc_set_prevol(u16 dig_vol)
{
    if (is_xdrc_prevol_en()){   //蓝牙音频时调法链路的前置音量
        xdrc_prevol_vol_set(dig_vol);
    } else {   //提示音或通话还是调以前的数字音量(DACVOLCON)
        dac_set_dvol(dig_vol);
    }
}


AT(.sbcdec.code)
void bt_sbc_pcm_output(void)
{
    u32 *outbuf = &dac_obuf[576];
    if (!(AUCON0 & BIT(26))) {
        AUCON0 |= BIT(26);                      //SBC DMA to RAM
        AUDMAADR = DMA_ADR(outbuf);
    } else {
        xdrc_dual_processs((u8*)outbuf,128, 0);
        obuf_put_samples_w(outbuf, 128);
    }
}



AT(.text.xdrc)
void bt_mono_xdrc_param_init(void)
{
    xdrc_online_adj_init();

    //PRE EQ
    exlib_softeq_cb_init(xdrc_preeq_cb, sizeof(xdrc_preeq_cb),RES_BUF_XDRC_PRE_EQ,RES_LEN_XDRC_PRE_EQ);

    //LP HP FILTER
    exlib_softeq_cb_init(xdrc_lp_cb, sizeof(xdrc_lp_cb),RES_BUF_XDRC_LP_EQ,RES_LEN_XDRC_LP_EQ);
    exlib_softeq_cb_init(xdrc_lp_cb2, sizeof(xdrc_lp_cb2),RES_BUF_XDRC_LP_EQ,RES_LEN_XDRC_LP_EQ);
    exlib_softeq_cb_init(xdrc_hp_cb, sizeof(xdrc_hp_cb),RES_BUF_XDRC_HP_EQ,RES_LEN_XDRC_HP_EQ);
    exlib_softeq_cb_init(xdrc_hp_cb2, sizeof(xdrc_hp_cb2),RES_BUF_XDRC_HP_EQ,RES_LEN_XDRC_HP_EQ);
    //LP HP EXPAND FILTER
    exlib_softeq_cb_init(xdrc_lp_exp_cb, sizeof(xdrc_lp_exp_cb),RES_BUF_XDRC_LP_EXP_EQ,RES_LEN_XDRC_LP_EXP_EQ);
    exlib_softeq_cb_init(xdrc_hp_exp_cb, sizeof(xdrc_hp_exp_cb),RES_BUF_XDRC_HP_EXP_EQ,RES_LEN_XDRC_HP_EXP_EQ);
    //DRC LP/HP
    exlib_drcv1_cb_init(xdrc_drclp_cb,sizeof(xdrc_drclp_cb),RES_BUF_XDRC_LP_DRC,RES_LEN_XDRC_LP_DRC);
    exlib_drcv1_cb_init(xdrc_drchp_cb,sizeof(xdrc_drchp_cb),RES_BUF_XDRC_HP_DRC,RES_LEN_XDRC_HP_DRC);

    //DRC ALL
    exlib_drcv1_cb_init(xdrc_drcall_cb,sizeof(xdrc_drcall_cb),RES_BUF_XDRC_ALL_DRC,RES_LEN_XDRC_ALL_DRC);

    //POST EQ
    music_set_eq_by_res(&RES_BUF_XDRC_POST_EQ, &RES_LEN_XDRC_POST_EQ);
}




#endif  //EXLIB_BT_MONO_XDRC_EN
